package com.qut.graduate.busrtquery.utils.baidumap;

import android.graphics.Point;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.baidu.mapapi.animation.Animation;
import com.baidu.mapapi.animation.ScaleAnimation;
import com.baidu.mapapi.animation.Transformation;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.qut.graduate.busrtquery.R;
import com.qut.graduate.busrtquery.utils.common.ContextUtils;
import com.qut.graduate.busrtquery.utils.uiabout.ToastColorfulUtils;

/**
 * @Author WLL
 * @Time: 2019/4/11 22:03
 */
public class BaiduMapUtils {

    /**
     * 查看交通情况
     *
     * @param baiduMap
     * @param coverageImgBtn
     */
    public static void getTrafficCondition(BaiduMap baiduMap, ImageButton coverageImgBtn) {
        if (baiduMap.isTrafficEnabled()) {
            baiduMap.setTrafficEnabled(false);
            coverageImgBtn.setImageDrawable(ContextUtils.getContext().getResources().getDrawable(R.mipmap.icon_traffic_off));
        } else {
            baiduMap.setTrafficEnabled(true);
            coverageImgBtn.setImageDrawable(ContextUtils.getContext().getDrawable(R.mipmap.icon_traffic_on));
        }
    }

    /**
     * 将屏幕跳转到路线指定的一段路程
     * @param baiduMap
     * @param latLng1 某路段起点对应经纬度
     * @param latLng2 某路段终点对应经纬度
     */
    public static void moveToLatLngBoundsBuilder(BaiduMap baiduMap ,LatLng latLng1, LatLng latLng2) {
        LatLngBounds.Builder builder = new LatLngBounds.Builder();
        builder.include(latLng1);
        builder.include(latLng2);
        baiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLngBounds(builder.build()));
    }

    /**
     * 将 latLng1 到 latLng2 段的路线详情的 文本 添加到地图上
     *
     * @param baiduMap
     * @param latLng1
     * @param latLng2
     * @param title
     * @return
     */
    public static Overlay addTextOverLayOnRoute(BaiduMap baiduMap , LatLng latLng1, LatLng latLng2, String title) {
        double latitude = (latLng1.latitude + latLng2.latitude) / 2;
        double longitude = (latLng1.longitude + latLng2.longitude) / 2;
        LatLng latLng = new LatLng(latitude, longitude);
        OverlayOptions ooText = new TextOptions().bgColor(0xAAFFFF00).fontSize(24).fontColor(0xff000000).text(title).position(latLng);
        return baiduMap.addOverlay(ooText);
    }

    /**
     * 添加覆盖物
     *
     * @param baiduMap
     * @param latLng
     */
    public static Marker addOverlay(BaiduMap baiduMap, LatLng latLng) {
        baiduMap.clear();
        BitmapDescriptor mMarker = BitmapDescriptorFactory.fromResource(R.mipmap.icon_gcoding);
        OverlayOptions options = new MarkerOptions().position(latLng).icon(mMarker).zIndex(5); // 图标
        return (Marker) baiduMap.addOverlay(options);
    }

    /**
     * 改变地图类型，有2d，3d，卫星三种
     *
     * @param baiduMap
     * @param mapType
     * @param overLook
     * @param zoom
     * @param layout
     */
    public static void changeMapType(BaiduMap baiduMap, int mapType, int overLook, float zoom, LinearLayout layout) {
        baiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, null));
        baiduMap.setMapType(mapType);
        MapStatus mMapStatus = new MapStatus.Builder().overlook(overLook).zoom(zoom).build(); // 地图当前状态
        MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus); // 地图将要变化成的状态
        baiduMap.setMapStatus(mMapStatusUpdate);
        layout.setVisibility(View.GONE);
    }

    /**
     * 放大百度地图
     *
     * @param baiduMap
     * @param zoomOutBtn 缩小按钮
     * @param zoomInBtn  放大按钮
     */
    public static void zoomIn(BaiduMap baiduMap, ImageButton zoomOutBtn, ImageButton zoomInBtn) {
        float zoomLevel = baiduMap.getMapStatus().zoom;
        if (zoomLevel <= 20) {
            baiduMap.animateMapStatus(MapStatusUpdateFactory.zoomIn());
            zoomOutBtn.setEnabled(true);
        } else {
            ToastColorfulUtils.info("已经放至最大");
            zoomInBtn.setEnabled(false);
        }
    }

    /**
     * 修改百度地图的默认配置
     *
     * @param mapView
     */
    public static void changeDefaultBaiDuMapView(MapView mapView , BaiduMap baiduMap) {
        mapView.showScaleControl(true);  // 显示地图上比例尺
        mapView.showZoomControls(false); // 显示地图缩放控件
        baiduMap.setCompassPosition(new Point(70, 250));  // 罗盘位置
        View child = mapView.getChildAt(1); // 隐藏百度的LOGO
        // 原理也就是在view里面找到一个iamgeview（也就是logo），然后隐藏
        if (child != null && (child instanceof ImageView)) {
            child.setVisibility(View.INVISIBLE);
            mapView.removeView(child);
        }
    }

    /**
     * 定位到指定经纬度
     * @param baiduMap
     * @param latLng
     */
    public static void getMyLocation(BaiduMap baiduMap, LatLng latLng) {
        MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
        baiduMap.animateMapStatus(msu);
    }

    /**
     * 缩小百度地图
     *
     * @param baiduMap
     * @param zoomOutBtn 缩小按钮
     * @param zoomInBtn  放大按钮
     */
    public static void zoomOut(BaiduMap baiduMap, ImageButton zoomOutBtn, ImageButton zoomInBtn) {
        float zoomLevel = baiduMap.getMapStatus().zoom;
        if (zoomLevel > 4) {
            baiduMap.animateMapStatus(MapStatusUpdateFactory.zoomOut());
            zoomInBtn.setEnabled(true);
        } else {
            ToastColorfulUtils.info("已经缩至最小");
            zoomOutBtn.setEnabled(false);
        }
    }

    /**
     * 开始缩放动画
     *
     * @param marker
     */
    public static void startScaleAnimation(Marker marker) {
        marker.setAnimation(getScaleAnimation());
        marker.startAnimation();
    }

    /**
     * 缩放动画
     *
     * @return
     */
    private static Animation getScaleAnimation() {
        ScaleAnimation mScale = new ScaleAnimation(1f, 2f, 1f);
        mScale.setDuration(2000);
        mScale.setRepeatMode(Animation.RepeatMode.RESTART); // 动画重复模式
        mScale.setRepeatCount(1); // 动画重复次数
        mScale.setAnimationListener(new MyAnimationListener());
        return mScale;
    }

    /**
     * 选择地点界面完成后跳动动画
     *
     * @param mScreenCenterPoint
     * @return
     */
    public static Animation getTransformationPoint(Point mScreenCenterPoint) {
        if (null != mScreenCenterPoint) {
            Point pointTo = new Point(mScreenCenterPoint.x, mScreenCenterPoint.y - 100);
            Transformation mTransform = new Transformation(mScreenCenterPoint, pointTo, mScreenCenterPoint);
            mTransform.setDuration(500);
            mTransform.setRepeatMode(Animation.RepeatMode.RESTART); // 动画重复模式
            mTransform.setRepeatCount(1); // 动画重复次数
            mTransform.setAnimationListener(new MyAnimationListener());
            return mTransform;
        }
        return null;
    }

    private static class MyAnimationListener implements Animation.AnimationListener {

        @Override
        public void onAnimationStart() {

        }

        @Override
        public void onAnimationEnd() {

        }

        @Override
        public void onAnimationCancel() {

        }

        @Override
        public void onAnimationRepeat() {

        }
    }

}
